package com.luyou.a06;

import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
import org.springframework.context.annotation.ConfigurationClassPostProcessor;
import org.springframework.context.support.GenericApplicationContext;

/**
 * Aware 接口用于注入一些与容器相关的信息，比如：
 * BeanNameAware 注入 Bean 的名字
 * BeanFactoryAware 注入 BeanFactory 容器
 * ApplicationContextAware 注入 ApplicationContext 容器
 * EmbeddedValueResolverAware 解析 ${}
 * @author 28336
 * @version 1.0
 * Create by 2023/12/20 20:16
 */
public class A06Application {

    public static void main(String[] args) {
        GenericApplicationContext  context = new GenericApplicationContext();
        context.registerBean("myBean" , MyBean.class);
        //提前注入BeanFactoryPostProcessor导致其他注解无效
//        context.registerBean("myConfig1", MyConfig1.class);
        //使用InitializingBean, ApplicationContextAware破局MyConfig1的问题
//        context.registerBean("myConfig2", MyConfig2.class);
        /**
         * BeanFactoryAware 、ApplicationContextAware 和 EmbeddedValueResolverAware
         * 三个接口的功能可以使用 @Autowired 注解实现，InitializingBean 接口的功能也可以使用 @PostConstruct 注解实现
         * 但必须添加如下后置处理器
         */
        context.registerBean(AutowiredAnnotationBeanPostProcessor.class);
        context.registerBean(CommonAnnotationBeanPostProcessor.class);

        // 解析配置类中的注解
        context.registerBean(ConfigurationClassPostProcessor.class);
        context.refresh();
        context.close();
    }
}
